﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Coldairarrow.Util.Helper
{
    public static class IdCardUtil
    {
        private static string GetCard(string cid)
        {

            if (cid.Length == 15)
            {
                cid = per15To18(cid);
            }
            string[] aCity = new string[] { null, null, null, null, null, null, null, null, null, null, null, "北京", "天津", "河北", "山西", "内蒙古", null, null, null, null, null, "辽宁", "吉林", "黑龙江", null, null, null, null, null, null, null, "上海", "江苏", "浙江", "安微", "福建", "江西", "山东", null, null, null, "河南", "湖北", "湖南", "广东", "广西", "海南", null, null, null, "重庆", "四川", "贵州", "云南", "西藏", null, null, null, null, null, null, "陕西", "甘肃", "青海", "宁夏", "新疆", null, null, null, null, null, "台湾", null, null, null, null, null, null, null, null, null, "香港", "澳门", null, null, null, null, null, null, null, null, "国外" };
            double iSum = 0;
            //string info="";
            System.Text.RegularExpressions.Regex rg = new System.Text.RegularExpressions.Regex(@"^\d{17}(\d|x)$");
            System.Text.RegularExpressions.Match mc = rg.Match(cid);
            if (!mc.Success)
            {
                return "格式不正确!";
                //return "";
            }
            cid = cid.ToLower();
            cid = cid.Replace("x", "a");
            if (aCity[int.Parse(cid.Substring(0, 2))] == null)
            {
                return "非法地区";
                //return "";
            }
            try
            {
                DateTime.Parse(cid.Substring(6, 4) + "-" + cid.Substring(10, 2) + "-" + cid.Substring(12, 2));
            }
            catch
            {
                return "非法生日";
                //return "";
            }
            for (int i = 17; i >= 0; i--)
            {
                iSum += (System.Math.Pow(2, i) % 11) * int.Parse(cid[17 - i].ToString(), System.Globalization.NumberStyles.HexNumber);
            }
            if (iSum % 11 != 1)
                return ("非法证号");
            //return ("");
            //
            return (cid.Substring(6, 4) + "-" + cid.Substring(10, 2) + "-" + cid.Substring(12, 2));
        }

        private static string per15To18(string perIDSrc)
        {
            int iS = 0;
            //加权因子常数
            int[] iW = new int[] { 7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2 };
            //校验码常数
            string LastCode = "10X98765432";
            //新身份证号
            string perIDNew;
            perIDNew = perIDSrc.Substring(0, 6);
            //填在第6位及第7位上填上‘1’，‘9’两个数字
            perIDNew += "19";
            perIDNew += perIDSrc.Substring(6, 9);
            //进行加权求和
            for (int i = 0; i < 17; i++)
            {
                iS += int.Parse(perIDNew.Substring(i, 1)) * iW[i];
            }
            //取模运算，得到模值
            int iY = iS % 11;
            //从LastCode中取得以模为索引号的值，加到身份证的最后一位，即为新身份证号。
            perIDNew += LastCode.Substring(iY, 1);
            return perIDNew;
        }
        //取得性别
        private static int CheckSex(string cid)
        {
            int sex;
            int man;
            if (cid.Length == 15)
            {
                man = int.Parse(cid.Substring(14, 1));
            }
            else if (cid.Length == 18)
            {
                man = int.Parse(cid.Substring(16, 1));
            }
            else man = 1;
            if (man % 2 == 0) sex = 0;
            else sex = 1;
            return sex;
        }

        public static int GetAgeByIdCard(string IdCard)
        {
            //实际运用
            //int sex = CheckSex(IdCard);//性别
            string aa = GetCard(IdCard);//得到生日并且在下面判断
            try
            {
                Convert.ToDateTime(aa);
            }
            catch (Exception)
            {
                throw new Exception("身份证号码有错误的地方");
            }
            DateTime MemberBirthday = Convert.ToDateTime(GetCard(IdCard));//会员生日
            TimeSpan tm = (TimeSpan)DateTime.Now.Subtract(MemberBirthday);//会员年龄
            int age = (int)(tm.Days)/365;//年龄取得整

            return age;
        }


    }
}
